from . import passport_blue
from flask import request,jsonify,current_app,make_response,session
# 导入自定义错误码
from info.utils.response_code import RET
# 导入captcha工具包生成图片验证码
from info.utils.captcha.captcha import captcha
from info import redis_store,db
# 导入常量配置文件
from info import constants
import re
import random
# 导入云通讯
from info.libs.yuntongxun.sms import CCP
# 导入User模型类
from info.models import User
from datetime import datetime

# 生成图片验证码
@passport_blue.route('/image_code')
def generate_image_code():
    # 1.接受UUID参数,如果没有参数，返回信息
    image_code_id = request.args.get('image_code_id')
    if not image_code_id:
        return jsonify(errno=RET.PARAMERR,errmsg='参数错误')
    # 2.利用captcha生成图片验证码
    name,text,image = captcha.generate_captcha()
    # 3.将图片信息存到redis中,并处理异常
    try:
        redis_store.setex('ImageCode_'+image_code_id,constants.IMAGE_CODE_REDIS_EXPIRES,text)
    except Exception as e:
        # 将错误信息存到日志中
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='存储数据失败')

    else:
        # 4.将图片对象返回到页面以便显示
        response = make_response(image)
        # 设置响应头信息
        response.headers['Content-Type'] = 'image/jpg'
        return response

# 短信验证码校验
@passport_blue.route('/sms_code',methods=['POST'])
def send_sms_code():
    # 获取post请求的三个参数
    mobile = request.json.get('mobile')
    image_code=request.json.get('image_code')
    image_code_id = request.json.get('image_code_id')
    print(mobile,image_code,image_code_id)
    # 检查参数完整性
    if not all([mobile,image_code,image_code_id]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')
    if not re.match(r'1[3456789]\d{9}$',mobile):
        return jsonify(errno=RET.PARAMERR,errmsg='手机号格式错误')
    # 获取图片验证码
    try:
        real_image_code = redis_store.get('ImageCode_'+image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询数据失败')
    if not real_image_code:
        return jsonify(errno=RET.NODATA,errmsg='图片验证码已过期')
    # 判断验证码是否一致
    try:
        redis_store.delete('ImageCode_'+image_code_id)
    except Exception as e:
        current_app.logger.error(e)
    if real_image_code.lower()!=image_code.lower():
        return jsonify(errno=RET.DATAERR, errmsg='图片验证码错误')
    # 检查用户是否存在
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询用户数据失败')
    else:
        if user:
            return jsonify(errno=RET.DATAERR, errmsg='手机号已注册')
    # 生成短信随机码
    sms_code = '%06d' % random.randint(0,999999)
    print(sms_code)
    try:
        redis_store.setex('SMSCode_' + mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='保存数据失败')
    # # 调用云通讯发送短信
    # try:
    #     # 构造发送短信对象
    #     ccp=CCP()
    #     # 第一个参数手机号，第二个参数短信内容，第三个参数模板id
    #     result=ccp.send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES/60],1)
    # except Exception as e:
    #     current_app.logger.error(e)
    #     return jsonify(errno=RET.THIRDERR,errmsg='发送短信异常')
        # 调用云通讯发送短信

    try:
        # 构造发送短信对象
        ccp = CCP()
        # 第一个参数手机号，第二个参数短信内容，第三个参数模板id
        result = ccp.send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES / 60], 1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg='发送短信异常')
    # print(result)
    # 判断发送结果
    if result == 0:
        return jsonify(errno=RET.OK, errmsg='发送成功')
    else:
        return jsonify(errno=RET.THIRDERR, errmsg='发送失败')

# 注册提交
@passport_blue.route('/register',methods=['POST'])
def register():
    # 获取参数
    mobile = request.json.get('mobile')
    smscode = request.json.get('smscode')
    password = request.json.get('password')
    # 检查参数
    if not all([mobile,smscode,password]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')
    if not re.match(r'1[3456789]\d{9}$',mobile):
        return jsonify(errno=RET.PARAMERR,errmsg='手机号的格式错误')

    # 根据手机号获取验证码
    try:
        real_sms_code = redis_store.get("SMSCode_" + mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据失败')
    # 如果为空,验证码已失效
    if not real_sms_code:
        return jsonify(errno=RET.NODATA, errmsg='短信验证码已过期')
    # 比较输入验证码是否正确
    if real_sms_code != str(smscode):
        return jsonify(errno=RET.DATAERR, errmsg='短信验证码错误')
    # 删除redis中存储的短信验证码
    try:
        redis_store.delete('SMSCode_' + mobile)
    except Exception as e:
        current_app.logger.error(e)
    # 检查用户是否存在
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询用户数据失败')
    else:
        if user:
            return jsonify(errno=RET.DATAERR,errmsg='手机号已注册')
    # 构建用户对象
    user = User()
    user.password=password
    user.nick_name=mobile
    user.mobile=mobile
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存用户信息失败')

    # session['user_id'] = user.id
    # session['mobile'] = mobile
    # session['nick_name'] = mobile

    return jsonify(errno=RET.OK, errmsg='OK')

# 登陆提交
@passport_blue.route('/login',methods=['POST'])
def login():
    # 获取参数
    mobile = request.json.get('mobile')
    password = request.json.get('password')

    # 检查参数
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数缺失')
    if not re.match(r'1[3456789]\d{9}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号的格式错误')
    # 检查用户是否存在
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询用户数据失败')

    if user is None or not user.check_password(password):
        return jsonify(errno=RET.DATAERR,errmsg='用户名或密码错误')

    user.last_login=datetime.now()

    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg='保存用户数据失败')

    session['user_id'] = user.id
    session['mobile'] = mobile
    session['nick_name'] = user.nick_name

    return jsonify(errno=RET.OK, errmsg='OK')

# 用户退出
@passport_blue.route('/logout')
def logout():
    session.pop('user_id', None)
    session.pop('mobile', None)
    session.pop('nick_name', None)
    # 返回结果
    return jsonify(errno=RET.OK, errmsg='OK')
